Android系统提供了访问系统应用程序的数据的功能,例如得到联系人信息等。本节内容详细叙述如何取得联系人信息。
在Android系统中,联系人应用程序为“Contacts”,中文名称为“通讯录”,该程序是一个ContentProvider,提供了供其它程序访问和操控的“界面”,方便其它程序使用,例如在自己的程序中调出手机上的联系人,然后给对方写邮件等。
Contacts应用程序数据库存放在什么地方呢?在DDMS中的“File Explorer”中可以看到存放的路径是\/data\/data\/com.android.provider.contacts\/databases\/contacts2.db。如图所见。
使用sqlite3.exe程序查看该数据库文件,可以发现数据库文件略微有些复杂,含有多个表,如下图所示。
我们要访问的联系人的数据就存放在这个数据库文件的各个表中。例如联系人id、联系人名称(display_name)、最后的通话时间、通话记录次数等信息就存放在contacts表中。幸好contacts程序提供了提供了用于管理联系人的Uri方便其它程序访问,下面给出几个常用的Uri:
ContactsContract.Contacts.CONTENT_URI:联系人
ContactsContract.CommonDataKinds.Phone.CONTENT_URI:电话,所指向的值其实是“content:\/\/ com.android.contacts\/data\/phones”,这个Uri会访问contacts表、 raw_contacts表和data表等。
ContactsContract.CommonDataKinds.Email.CONTENT_URI:邮件
7.4.2.1 联系人权限 要想访问联系人,必须设置读或写的权限。
<!--读取联系人权限-->
<uses-permission android:name="android.permission.READ_CONTACTS" />
<!--写入联系人权限-->
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
7.4.2.2 联系人示例
该程序界面同样十分简单,界面有几个按钮,在此不给出具体布局,仅给出每个按钮的事件处理器。
//得到全部联系人
buttonAll.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Cursor cursor=resolver.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);
while(cursor.moveToNext()){
String msg;
//id
String id=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
msg="id:"+id;
//name
String name=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
msg=msg+" name:"+name;
//phone
Cursor phoneNumbers=resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID +"="+id,null,null);
while(phoneNumbers.moveToNext()){
String phoneNumber=phoneNumbers.getString(phoneNumbers.
getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
msg=msg+" phone:"+phoneNumber;
}
//email
Cursor emails=resolver.query(ContactsContract.CommonDataKinds.Email.
CONTENT_URI,null,ContactsContract.CommonDataKinds.Email.CONTACT_ID +"="+id,null,null);
while(emails.moveToNext()){
String email=emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
msg=msg+" email:"+email;
}
Log.v(TAG,msg);
}
}
});